package simple_sql

import (
	"database/sql"
)

// DB 包装了数据库连接，提供了简单SQL操作的方法
type DB struct {
	db *sql.DB
}

// NewDbClient 打开数据库链接
// 参数:
//
//	driver: 数据库驱动名称，例如"mysql"、"postgres"等
//	dsn: 数据源名称，包含连接数据库所需的信息
//
// 返回值:
//
//	*DB: 数据库操作实例
//	error: 错误信息，如果连接失败则返回错误
func NewDbClient(driver, dsn string) (*DB, error) {
	db, err := sql.Open(driver, dsn)
	if err != nil {
		return nil, err
	}
	return &DB{db: db}, nil
}

func (d *DB) Ping() error {
	return d.db.Ping()
}

func (d *DB) Driver() *sql.DB {
	return d.db
}

// Close 关闭数据库连接
func (d *DB) Close() {
	_ = d.db.Close()
}

// Select 构建查询语句的SELECT部分
// 参数:
//
//	tableName: 表名，不能为空
//	field: 一个或多个字段名，如果为空则默认查询所有字段
//
// 返回值:
//
//	*QuerySelect: 查询构建器，用于后续的查询操作
func (d *DB) Select(tableName string, field ...string) *QuerySelect {
	if tableName == "" {
		return nil
	}
	query := &QuerySelect{tableName: tableName, query: d.db}
	if field != nil {
		query.columns = field
	}
	return query
}

// Insert 构建查询语句的INSERT部分
// 参数:
//
//	tableName: 表名，不能为空
//	field: 一个或多个字段名，用于插入数据的列
//
// 返回值:
//
//	*QueryInsert: 查询构建器，用于后续的插入操作
func (d *DB) Insert(tableName string, field ...string) *QueryInsert {
	if tableName == "" {
		return nil
	}
	query := &QueryInsert{tableName: tableName, query: d.db}
	if field != nil {
		query.columns = field
	}
	return query
}

// Update 构建查询语句的UPDATE部分
// 参数:
//
//	tableName: 表名，不能为空
//
// 返回值:
//
//	*QueryUpdate: 查询构建器，用于后续的更新操作
func (d *DB) Update(tableName string) *QueryUpdate {
	if tableName == "" {
		return nil
	}
	return &QueryUpdate{tableName: tableName, query: d.db}
}

// Delete 构建查询语句的DELETE部分
// 参数:
//
//	tableName: 表名，不能为空
//
// 返回值:
//
//	*QueryDel: 查询构建器，用于后续的删除操作
func (d *DB) Delete(tableName string) *QueryDel {
	if tableName == "" {
		return nil
	}
	return &QueryDel{tableName: tableName, query: d.db}
}

// BeginTx 开启一个新的事务
func (d *DB) BeginTx() (*Tx, error) {
	tx, err := d.db.Begin()
	if err != nil {
		return nil, err
	}
	return &Tx{tx: tx}, nil
}

// Tx 封装了事务操作
type Tx struct {
	tx *sql.Tx
}

// Commit 提交事务
func (t *Tx) Commit() error {
	return t.tx.Commit()
}

// Rollback 回滚事务
func (t *Tx) Rollback() error {
	return t.tx.Rollback()
}

// Select 构建事务中的查询语句
func (t *Tx) Select(tableName string, field ...string) *QuerySelect {
	query := &QuerySelect{tableName: tableName, tx: t.tx}
	if field != nil {
		query.columns = field
	}
	return query
}

// Insert 构建事务中的插入语句
func (t *Tx) Insert(tableName string, field ...string) *QueryInsert {
	query := &QueryInsert{tableName: tableName, tx: t.tx}
	if field != nil {
		query.columns = field
	}
	return query
}

// Update 构建事务中的更新语句
func (t *Tx) Update(tableName string) *QueryUpdate {
	return &QueryUpdate{tableName: tableName, tx: t.tx}
}

// Delete 构建事务中的删除语句
func (t *Tx) Delete(tableName string) *QueryDel {
	return &QueryDel{tableName: tableName, tx: t.tx}
}
